sec+docs: endurecer contenedor y cabeceras, licencia Apache 2.0 y protocolo de relay documentado - #53
Merged
Merged
Conversation
El contenedor corria como root: la imagen node:22-alpine trae un usuario `node` sin privilegios que no se estaba usando. Y no declaraba HEALTHCHECK pese a que /healthz existe desde el principio, asi que Docker solo sabia si el proceso seguia vivo, no si seguia sirviendo. Se pregunta con el propio Node, que no hay curl en la imagen. Las respuestas llevan ahora CSP, X-Content-Type-Options, Referrer-Policy y Permissions-Policy. Van en server/index.js y no en el Caddyfile para que viajen con la aplicacion -- valen igual en `npm run dev`, en la suite y en un despliegue sin Caddy -- y sobre todo para poder probarlas. HSTS es la excepcion y se queda en Caddy: anunciarlo desde un servidor que tambien habla http dejaria inaccesible el localhost de quien desarrolle, durante meses. La CSP esta ajustada a lo que la web usa de verdad: ni 'unsafe-inline' ni 'unsafe-eval', y ni una peticion a terceros (la fuente ya estaba servida desde public/fonts). Eso obligo a quitar el unico estilo en linea que quedaba, un style="color: var(--red)" en index.html que el navegador bloqueaba. Verificado con Chrome de verdad: cero violaciones de CSP en / y en /speed, una transferencia completa entre dos pestanas y la cadena de reenvio con dos receptores, las dos con el hash comprobado. Cierra #30.
El repositorio es publico y distribuye binarios para cinco plataformas sin licencia declarada, que por defecto significa que nadie tiene permiso para usarlo, modificarlo ni redistribuirlo: justo lo contrario de lo que pretende el proyecto. Se elige Apache 2.0 -- permisiva como MIT, pero con concesion expresa de patentes y obligacion de indicar los cambios. CONTRIBUTING recoge lo que hasta ahora habia que deducir leyendo el codigo: como montar el entorno, que los tests ya no necesitan servidor, que los comentarios explican el porque y no el que, el formato de los commits, que la interfaz va en ingles y todo lo demas en espanol, y que la web no hace ni una peticion a terceros. CHANGELOG reconstruye las diecisiete versiones publicadas a partir de los tags y de las notas de cada release. Cierra #31.
Los mensajes `cli-*` estaban repartidos entre cli/src/cli.js, cli/src/transfer.js y public/app.js sin ninguna descripcion central: tres implementaciones parciales del mismo protocolo, y las divergencias entre ellas son exactamente lo que dejo al receptor sin mandar los acuses que el emisor esperaba, parando cualquier transferencia al llegar a la ventana de 8 MB. La descripcion canonica va encima de `receiveFromRelay`, en transfer.js: cada mensaje, quien lo emite, cuando y que espera de vuelta, incluido el control de flujo por ventana de acuses y el reloj de inactividad. Las otras dos implementaciones apuntan ahi. Cierra #32.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Las tres P2 que quedaban sin depender de tocar el protocolo de transferencia.
Contenedor y cabeceras (#30)
El contenedor corría como root:
node:22-alpineya trae un usuarionodesin privilegiosque no se estaba usando. Y no declaraba
HEALTHCHECKpese a que/healthzexiste desde elprincipio, así que Docker sabía si el proceso seguía vivo, no si seguía sirviendo. Se pregunta
con el propio Node, que no hay curl en la imagen.
Las respuestas llevan ahora CSP,
X-Content-Type-Options,Referrer-PolicyyPermissions-Policy:Van en
server/index.jsy no en el Caddyfile a propósito: así viajan con la aplicación —valenigual en
npm run dev, en la suite y en un despliegue sin Caddy— y sobre todo se puedenprobar, en vez de confiar en que el proxy de producción esté bien. HSTS es la excepción y
se queda en Caddy: anunciarlo desde un servidor que también habla http dejaría inaccesible el
localhost de quien desarrolle, durante meses.
Sin
'unsafe-inline'ni'unsafe-eval', que es lo que hace que la política valga algo. Esoobligó a quitar el único estilo en línea que quedaba, un
style="color: var(--red)"enindex.htmlque el navegador estaba bloqueando.Licencia y documentos del repo (#31)
El repositorio es público y distribuye binarios para cinco plataformas sin licencia
declarada, que por defecto significa que nadie tiene permiso legal para usarlo, modificarlo ni
redistribuirlo. Ahora es Apache 2.0: permisiva como MIT, pero con concesión expresa de
patentes y obligación de indicar los cambios.
CONTRIBUTING.mdrecoge lo que había que deducir leyendo el código: entorno, tests,comentarios que explican el porqué, formato de commits, interfaz en inglés y resto en español,
y cero peticiones a terceros.
CHANGELOG.mdreconstruye las diecisiete versiones publicadas desde los tags y las notas decada release.
license,authoryrepositoryen elpackage.json.El protocolo de relay, en un solo sitio (#32)
Los mensajes
cli-*estaban repartidos entre tres ficheros sin descripción central. No es unproblema estético: tres implementaciones parciales del mismo protocolo es exactamente lo que
dejó al receptor sin mandar los acuses que el emisor espera, parando cualquier transferencia al
llegar a la ventana de 8 MB.
La descripción canónica va encima de
receiveFromRelayencli/src/transfer.js—cada mensaje,quién lo emite, cuándo y qué espera de vuelta, con el control de flujo por ventana de acuses y
el reloj de inactividad—, y las otras dos implementaciones apuntan ahí.
Verificación
npm test: 107/107, con tres casos nuevos entest/headers.test.mjs. Uno de ellos fallasi alguien vuelve a meter un
style=, un<script>sinsrco unon*=enpublic/*.html,que es la forma habitual de acabar aflojando la CSP hasta dejarla en adorno.
/y en/speed, consola limpia.receptores (1,05 copias, los dos con el hash correcto).
USER nodey elHEALTHCHECKno se pueden probar aquí (no hay Docker en esta máquina): severán en el despliegue, y lo confirmaré con
docker compose psen el VPS.Closes #30, closes #31, closes #32.